# 基于命令行的学生管理系统

import sys
import os


students = []

def menu():
    print('-----------------------------------------')
    print('----------欢迎来到学生管理系统-----------')
    print('-----------------------------------------')



# 存档
def save():
    with open('record.txt', 'w', encoding = 'utf8') as f:
        for s in students:
            f.write(f"{s['studentId']}\t{s['name']}\t{s['classId']}\t{s['gender']}\n")



# 读档
def load():
    if not os.path.exists('record.txt'):
        print('读档文件不存在')
        return
    # 先将students列表置空 之后将record存档的内容放入student中
    # 在局部给全局变量重新赋值必须使用global关键字修饰
    global students
    students = []
    with open('record.txt', 'r', encoding = 'utf8') as f:
        for line in f:
            # 将一行的首尾空格去掉
            # 之后按照制表符为分割将line内容写到字典中
            line = line.strip()
            tokens = line.split('\t')

            # 若是tokes大小不是4 那么就有问题 重新提取信息
            if len(tokens) != 4:
                print('元素提取出错')
                continue

            student = {
                'studentId' : tokens[0],
                'name' : tokens[1],
                'classId' : tokens[2],
                'gender' : tokens[3]
            }

            students.append(student)




def insert():
    print('[新增信息] 开始!')
    # 先输入信息
    studentId = input('输入学生学号: ')
    # 学号不能重复
    for s in students:
        if studentId == s['studentId']:
            print('学号重复!')
            return
    name = input('输入学生姓名: ')
    classId = input('输入学生班级: ')
    gender = input('输入学生性别: ')
    # 性别只能是男女
    if gender not in ('男', '女'):
        print('性别输入有误!')
        return
    # 用一个字典表示一个学生的信息
    student = {
        'studentId' : studentId,
        'name' : name,
        'classId' : classId,
        'gender' : gender
    }
    students.append(student)
    save()
    print('新增了一条学生信息')
    print('[新增信息] 结束!')


def show():
    if len(students) == 0:
        print('现在没有学生信息!')
        return
    print('[显示信息] 开始!')
    for s in students:
        print(f"[{s['studentId']}]\t{s['name']}\t{s['classId']}\t{s['gender']}")
    print(f'显示了{len(students)}条学生信息')
    print('[显示信息] 结束!')
    


def delete():
    # 根据学号进行删除
    print('[删除信息] 开始!')
    studentId = input('输入要删除的学生的学号:')
    for s in students:
        if studentId == s['studentId']:
            students.remove(s)
    save()
    print('删除了一条学生信息')
    print('[删除信息] 结束!')



def find(): 
    print('[查找信息] 开始!')
    count = 0
    # 输入要查找的学生姓名
    name = input('输入要查找的学生姓名:')
    for s in students:
        if name == s['name']:
            print(f"[{s['studentId']}]\t{s['name']}\t{s['classId']}\t{s['gender']}")
            count += 1
    print(f'查找到了{count}条学生信息')
    print('[查找信息] 结束!')
    


# 入口函数
def main():
    # 打印菜单
    menu()

    # 读档
    load()
    print(students)
    # 输入数字进行增删查改操作
    while True:
        choice = input('请输入您将要进行的操作: ')

        if choice == '1':
            # 增加一条学生信息
            insert()
        elif choice == '2':
            # 显示所有的学生信息
            show()
        elif choice == '3':
            # 删除指定的学生信息
            delete()
        elif choice == '4':
            # 显示指定的学生信息
            find()
        elif choice == '0':
            # 退出学生管理系统
            print('选择退出学生管理系统')
            print('goodbye!!!')
            sys.exit(0)
        else:
            # 这里选择输入有误 重新输入
            print('选择输入有误, 重新输入')


main()


# global使用是当局部使用到全局变量时 而且这种使用是重新给全局变量赋值 单纯的增删可以不加global

# 存档和读档
# 这里的students只是内存级的 需要永久存放就要放在磁盘上
# 因此存档可以创建一个文件 给这个文件里面写入students的内容 每一次修改students就存一次
# 读档是将上一次的存档的内容读到当前students中 然后继续后面的增删查改操作 
# 这样一来 后面再次存档的时候的信息是包括上一次程序的信息和这一次的信息的
# 存档在程序开头 这样保证信息的顺序性